/*
# MIAHX© 框架消息 FastDDS API 的包装类（C端）

Version: 0.4.10,
Last updated: October 16, 2024

## Contributor(s)
* YAO Naiming <[naiming@iscas.ac.cn](mailto:naiming@iscas.ac.cn)>

## Change log
### v0.4.10
- .16: [新增] 迁移实现，新增注释，修复 get_stream_handler 实现缺陷

---
Copyright © 2024-2025 MIAHX Contributors, ISCAS, and ASIC. All Rights Reserved.
Licensed under Apache-2.0.
*/

#pragma once

#include "miahx/bng_classical_reader.h"


/**
 * @brief 数据流回调函数类型（C接口）
 */
typedef void (*stream_callback_c)(const char*);


/**
 * @brief 数据流处理器（C接口）
 */
class StreamHandlerC {
public:
    /**
     * @brief 获取消息队列中的下一项数据，表示为 JSON 字符串
     *
     * @param str 字符串缓冲区
     * @param len 字符串缓冲区长度
     * @return 可被转换为 JSON 对象的字符串
     */
    MIAHX_WRAPPER_API
    virtual size_t next_as_json_str(char *str, size_t len) = 0;

    /**
     * @brief 设置回调函数
     *
     * @param callback 数据流回调函数
     */
    MIAHX_WRAPPER_API
    virtual void set_callback(stream_callback_c callback) = 0;
};


/**
 * @brief MIAHX(R) 交互框架消息库包装器（C接口）
 */
class MiahxWrapperC {
public:
    /**
     * @brief 获取单例
     *
     * @return 单例指针，无需析构
     */
    MIAHX_WRAPPER_API
    static MiahxWrapperC *get_instance();

    /**
     * @brief 获取指定名称的数据流处理器对象.\n
     * 首次获取将创建对应的 SteamHandler 对象，再次获取将复用首次创建的对象.
     *
     * @param name StreamHandler 类型名，当前可选值为：vcls
     * @return StreamHandler 类型对象的指针，无需析构
     */
    MIAHX_WRAPPER_API
    StreamHandlerC *get_stream_handler(const char *name);

    /**
     * @brief 设置数据流回调函数
     * @param name StreamHandler 类型名，当前可选值为：vcls
     * @param listener 数据流回调函数
     */
    MIAHX_WRAPPER_API
    void set_stream_listener(const char *name, stream_callback_c listener);

    MiahxWrapperC(const MiahxWrapperC &instance) = delete;

    const MiahxWrapperC &operator=(const MiahxWrapperC &instance) = delete;

private:
    MiahxWrapperC();

private:
    std::shared_ptr<Participant> mParticipant;
    std::map<std::string, shared_ptr<StreamHandlerC>> mHandlers;
    std::map<std::string, stream_callback_c> mListeners;
};
